软件中的错误。
例子:
整数溢出/下溢,栈/堆溢出,越界读/写,释放后使用,双重释放
整数数据类型中的漏洞,它们存储数据的方式。
例子:
unsigned int j;
int i;
整数的大小 = 4 bytes
最大值 = 11111111 11111111 11111111 11111111
每个位可以是0或1。所以它可以表示2个ue,它可以存储的是 = 2^32
签名还是未签名?
MSB 用于签名。
1= 00000000000000000000000000000001
-1 = 10000000000000000000000000000001
有符号整数的最大值= 0x7FFFFFFF
无符号整数的最大值 = 0xFFFFFFFF
在这种情况下会发生什么?
int i;
unsigned int j;
j = 0xFFFFFFFF + 1
结果将变成0,传输1位将被截断。
i = 0x7FFFFFFFF + 1
结果将变成-0x8000000(负数)
整数的大小 = 4 bytes
有符号与无符号?
有符号int的范围= -0x80000000 至 0x7FFFFFFF
无符号的int的范围 = 0 至 0xFFFFFFFF
在这种情况下会发生什么?
int i;
i = -0x80000000 – 1 = 0x7FFFFFFF
i = 可能的最大正数。
栈溢出- overflowing the local variable stored inside the stack. They can corrput data on the stack like return address and other variables. Example:
Function foo(){
char var1[8];
char var2[100];
memcpy(var1,var2,sizeof(var2)); 🡪 stack overflow
}
Following is a real life example of a stack overflow vulnerability in vlc media player:
引用 : https://hackerone.com/reports/489102
堆溢出 - 当进程不确定内存大小时,就会使用堆。因此,它们在运行时由malloc、calloc、realloc等函数分配。这种内存分配的溢出会破坏各种堆管理数据。例子:
function test(){
char *var1 = (char*) malloc(8);
char var2[100];
memcpy(var1,var2,sizeof(var2)); 🡪 heap overflow
}
越界读取 - 内存访问或写入操作超出了堆栈内存的允许限度。在栈和堆内存中都可能发生。
例子:
char a[10];
char b;
b=a[100]; 🡪OOB Read
a[100] = ‘c'; 🡪OOB Write
Following is a real life out of bound read issue in libgd:
参考资料 https://github.com/libgd/libgd
越界写入- 内存访问或写操作超出了堆内存的允许限度。可以同时发生在堆栈和堆内存中。
例子:
char* a = (char*)malloc(10);
char b;
b=a[100]; 🡪 OOB read
a[100] =‘c'; 🡪OOB Write
free(释放)后使用- 释放内存后使用内存。
例子:
char *buff = (char*)malloc(10);
free(buff);
buff[0]=‘c'; 🡪 use after free
下面是一个关于libtiff中释放后使用漏洞的真实例子:
参考资料: https://www.asmail.be/msg0055359936.html
多次free -多次释放分配的内存。例子:
char *buff = (char*)malloc(10);
free(buff);
free(buff); 🡪 double free